package net.chasing.androidbaseconfig.util;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
import androidx.annotation.NonNull;

import android.util.DisplayMetrics;
import android.view.Display;
import android.view.ViewGroup;
import android.view.WindowManager;

import static android.view.View.NO_ID;

public class GenericTools {
    /**
     * 返回屏幕高度（不包含虚拟导航栏及状态栏）
     */
    public static int getScreenHeight(Activity activity) {
        if (activity == null) return 0;
        return getScreenHeightWithoutNavigation(activity) - getStatusBarHeight(activity);
    }

    /**
     * 返回屏幕高度（包含虚拟导航栏及状态栏）
     */
    public static int getScreenHeightFull(Activity activity) {
        try {
            DisplayMetrics dm = new DisplayMetrics();
            WindowManager localWindowManager =
                    (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
            localWindowManager.getDefaultDisplay().getRealMetrics(dm);
            return dm.heightPixels;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 返回屏幕高度（不包含虚拟导航栏，包含状态栏）
     */
    public static int getScreenHeightWithoutNavigation(Activity activity) {
        try {
            return getScreenHeightFull(activity) - getNavigationBarHeight(activity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 返回屏幕宽度
     */
    public static int getScreenWidth(Activity activity) {
        if (activity == null) return 0;
        return activity.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 获取状态栏高度
     */
    public static int getStatusBarHeight(Context context) {
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }

    // region 底部虚拟按键栏的高度
    public static int getNavigationBarHeight(Activity activity) {
        if (!isNavigationBarExist(activity)) return 0;
        return getNavigationBarHeightWithoutJudge(activity);
    }

    public static int getNavigationBarHeightWithoutJudge(Activity activity) {
        int result = 0;
        Resources res = activity.getResources();
        int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = res.getDimensionPixelSize(resourceId);
        }
        return result;
    }

    /**
     * 判断是否是全面屏
     * 目前仅通过屏幕尺寸比进行粗略判断是否为全面屏
     */
    private volatile static boolean mHasCheckAllScreen;
    private volatile static boolean mIsAllScreenDevice;

    private static boolean isAllScreenDevice(Context context) {
        if (mHasCheckAllScreen) {
            return mIsAllScreenDevice;
        }
        mHasCheckAllScreen = true;
        mIsAllScreenDevice = false;
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        if (windowManager != null) {
            Display display = windowManager.getDefaultDisplay();
            Point point = new Point();
            display.getRealSize(point);
            float width, height;
            if (point.x < point.y) {
                width = point.x;
                height = point.y;
            } else {
                width = point.y;
                height = point.x;
            }
            if (height / width >= 1.97f) {
                mIsAllScreenDevice = true;
            }
        }
        return mIsAllScreenDevice;
    }

    private static final String NAVIGATION = "navigationBarBackground";

    /**
     * 适配全面屏的判断（如果不是全面屏的手机进行判断始终返回true）
     * 该方法需要在View完全被绘制出来之后调用，否则判断不了
     * 在比如 onWindowFocusChanged（）方法中可以得到正确的结果
     */
    public static boolean isNavigationBarExist(@NonNull Activity activity) {
        if (!isAllScreenDevice(activity)) return true;
        boolean inMultiWindowMode = ActivityUtils.isInMultiWindowMode(activity);
        if (inMultiWindowMode) return false; // 分屏/小窗口模式，不统计底部导航栏
        ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
        for (int i = 0; i < vp.getChildCount(); i++) {
            vp.getChildAt(i).getContext().getPackageName();
            if (vp.getChildAt(i).getId() != NO_ID &&
                    NAVIGATION.equals(activity.getResources().getResourceEntryName(vp.getChildAt(i).getId()))) {
                return true;
            }
        }
        return false;
    }
    // endregion

    /**
     * 获取软件盘的高度
     */
    public static int getSupportSoftInputHeight(Activity activity) {
        Rect r = new Rect();
        /*
         * decorView是window中的最顶层view，可以从window中通过getDecorView获取到decorView。
         * 通过decorView获取到程序显示的区域，包括标题栏，但不包括状态栏。
         */
        //获取屏幕的高度
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
        int screenHeight = activity.getWindow().getDecorView().getRootView().getHeight();
//        int screenHeight = GenericTools.getScreenHeight(mActivity);
        //计算软件盘的高度
        int softInputHeight = screenHeight - r.bottom;

        /*
         * 某些Android版本下，没有显示软键盘时减出来的高度总是144，而不是零，
         * 这是因为高度是包括了虚拟按键栏的(例如华为系列)，所以在API Level高于20时，
         * 我们需要减去底部虚拟按键栏的高度（如果有的话）
         */
        // When SDK Level >= 20 (Android L), the softInputHeight will contain the height of softButtonsBar (if has)
        // 传入的HomeActivity不包含虚拟导航栏高度，因此暂时屏蔽
        softInputHeight = softInputHeight - getNavigationBarHeight(activity);
        if (softInputHeight < 0) {
            //不返回负数
            softInputHeight = 0;
        }
        return softInputHeight;
    }

    /**
     * 获取设备像素
     *
     * @return int[] index 0宽,index 1 高
     */
    public static int[] getDevicePixel(Activity activity) {
        int[] px = new int[2];
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);

        // 获得手机的宽度和高度像素单位为px
        px[0] = dm.widthPixels;
        px[1] = dm.heightPixels;
        return px;
    }

    /**
     * 获取设备密度系数
     */
    public static float getDensity(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.density;
    }

    /**
     * dp转px
     */
    public static int dip2px(Context context, float dipValue) {
        return Math.round(context.getResources().getDisplayMetrics().density * dipValue);
    }

    /**
     * px转dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将sp值转换为px值，保证文字大小不变
     *
     * @param spValue （DisplayMetrics类中属性scaledDensity）
     */
    public static int sp2px(Context context, float spValue) {
        if (ViewUtils.isUseDp) return dip2px(context, spValue);
        else {
            if (context == null) return 0;
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (spValue * fontScale + 0.5f);
        }
    }
}